home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 5 / Gekikoh Dennoh Club Vol. 5 (Japan).7z / Gekikoh Dennoh Club Vol. 5 (Japan) (Track 01).bin / internet / tcppack / tcppackb.lzh / src / samples / netstat.c < prev    next >
C/C++ Source or Header  |  1994-08-26  |  11KB  |  480 lines

  1. /*
  2.  * netstat.c
  3.  *
  4.  * Copyright (C) 1994 Tomoaki Tada/F.C.T.
  5.  */
  6.  
  7. static char *rcsid = "$Id: netstat.c,v 1.5 1994/08/04 05:02:08 Niggle Exp $";
  8.  
  9. /*
  10.  * $Log: netstat.c,v $
  11.  * Revision 1.5  1994/08/04  05:02:08  Niggle
  12.  * inetdé¬ÅφÆôé╡é─éóé╚éóÅΩìçé╠ò\Īé≡ò╧ìX
  13.  *
  14.  * Revision 1.4  1994/08/03  01:58:42  Niggle
  15.  * alias é≡Ägùpé╖éΘé╠é≡éΓé▀é─üCnameé⌐éτdomain nameé≡Å£éóé╜éαé╠é≡Ägéñéµéñò╧ìX
  16.  *
  17.  * Revision 1.3  1994/07/19  12:24:35  Niggle
  18.  * default routeé╠ò\Īé≡é╖éΘéµéñé╔ò╧ìX
  19.  * get{host,net}by{addr,name}()é╔æ╬ë₧
  20.  * òsùvé╚âIâvâVâçâôé≡getopt()é⌐éτô╛é╚éóéµéñé╔ò╧ìX
  21.  *
  22.  * Revision 1.2  1994/06/23  04:02:35  Niggle
  23.  * sigintè╓ÿAé╠ò╧ìX
  24.  *
  25.  * Revision 1.1  1994/06/22  02:00:15  Niggle
  26.  * Initial revision
  27.  *
  28.  */
  29.  
  30. #include<stdio.h>
  31. #include<stdlib.h>
  32. #include<string.h>
  33. #include<conio.h>
  34. #include<unistd.h>
  35. #include<signal.h>
  36. #ifdef __human68k__
  37. #undef __DOS_INLINE__
  38. #define __DOS_INLINE__
  39. #include<sys/dos.h>
  40. #endif
  41.  
  42. #include"network.h"
  43. #include"socket.h"
  44.  
  45. static int num_of_socket;
  46. static long *sockets;
  47.  
  48. static int no_convert_p;            /* Don't convert ip to hostname */
  49. static int statics_p;                /* Show statics */
  50. static int sleep_time;
  51.  
  52. static void display_interface_list (char *);
  53. static void display_interface_list_c (char *);
  54. static void display_unix_socket (void);
  55. static void display_inet_socket (void);
  56. static void display_route_table (void);
  57. static void display_a_route (route *);
  58. static char * itoa_rflag (route *);
  59.  
  60. static char *ipaddr2host (long);
  61. static char *ipaddr2net (long);
  62.  
  63. /************************************************
  64.  *                        *
  65.  ************************************************/
  66. void
  67. main (int argc, char **argv)
  68. {
  69.   long version = _get_version ();
  70.   int unix_p, inet_p, route_p, iface_list_p;
  71.   char *iface_name;;
  72.  
  73.   unix_p = inet_p = route_p = iface_list_p = 0;
  74.   no_convert_p = statics_p = 0;
  75.   iface_name = NULL;
  76.   if (version == -1)
  77.     fprintf (stderr, "TCP/IP driveré═ÅφÆôé╡é─éóé▄é╣é±\n");
  78.   else
  79.     {
  80.       int c;
  81.  
  82.       opterr = 1;
  83.       while ((c = getopt (argc, argv, "f:I:inp:rsw:")) != EOF)
  84.     {
  85.       switch (c)
  86.         {
  87.         case 'f':
  88.           if (!strcmp (optarg, "inet"))
  89.         inet_p = 1;
  90.           else if (!strcmp (optarg, "local"))
  91.         unix_p = 1;
  92.           else
  93.         printf ("unknown address type.\n");
  94.           break;
  95.         case 'I':
  96.           iface_name = optarg;
  97.           iface_list_p = 1;
  98.           break;
  99.         case 'i':
  100.           /* display all table */
  101.           iface_list_p = 1;
  102.           break;
  103.         case 'n':
  104.           no_convert_p = 1;
  105.           break;
  106.         case 'p':
  107.           /* TODO */
  108.           break;
  109.         case 'r':
  110.           route_p = 1;
  111.           break;
  112.         case 's':
  113.           statics_p = 1;
  114.           break;
  115.         case 'w':
  116.           sleep_time = atoi (optarg);
  117.           iface_list_p = 1;
  118.           break;
  119.         default:
  120.           break;
  121.         }
  122.     }
  123.  
  124.       num_of_socket = 0;
  125.       sockets = get_sock_array (&num_of_socket);
  126.       if (sockets)
  127.     {
  128.       if (!(inet_p || unix_p || iface_list_p || route_p))
  129.         {
  130.           display_inet_socket ();
  131.           return;
  132.         }
  133.  
  134.       if (inet_p)
  135.         display_inet_socket ();
  136.       if (unix_p)
  137.         display_unix_socket ();
  138.       free (sockets);
  139.     }
  140.  
  141.       if (sleep_time)
  142.     display_interface_list_c (iface_name);
  143.       else if (iface_list_p)
  144.     display_interface_list (iface_name);
  145.  
  146.       if (route_p)
  147.     display_route_table ();
  148.     }
  149.   return;
  150. }
  151.  
  152. /************************************************
  153.  *                        *
  154.  ************************************************/
  155. static void
  156. display_interface_list (char *i_name)
  157. {
  158.   iface *top, *cur;
  159.  
  160.   top = get_iface_list ();
  161.   if (top)
  162.     {
  163.       printf ("Name  Mtu   NetWork     Address            Ipkts Ierrs    Opkts Oerrs  Coll\n");
  164.       for (cur = top; cur != NULL; cur = cur->next)
  165.     {
  166.       char buff[32];
  167.       char buff2[32];
  168.       char *net, *name;
  169.  
  170.       if (i_name && strcmp (cur->name, i_name))
  171.         continue;
  172.  
  173.       cur->update (cur);
  174.       name = ipaddr2host (cur->my_ip_addr);
  175.       net = ipaddr2net (cur->my_ip_addr & cur->net_mask);
  176.  
  177.       n2a_ipaddr (cur->my_ip_addr, buff);
  178.       n2a_ipaddr (cur->my_ip_addr & cur->net_mask, buff2);
  179.       printf ("%4s  %4.4d  %-10s  %-10s      %8d  %4d %8d  %4d  %4d\n",
  180.           cur->name,
  181.           cur->mtu,
  182.           net && ! no_convert_p ? net : buff2,
  183.           name && ! no_convert_p ? name : buff,
  184.           cur->rawrcvcnt /*+ cur->iprcvcnt*/,
  185.           cur->rcverrcnt,
  186.           cur->rawsndcnt /*+ cur->ipsndcnt*/,
  187.           cur->snderrcnt,
  188.           cur->collcnt);
  189.     }
  190.       fflush (stdout);
  191.     }
  192.   return;
  193. }
  194.  
  195. /************************************************
  196.  *                        *
  197.  ************************************************/
  198. static void
  199. calc_iface_stat (iface *top, iface *src, long *total, long *diff, long *total2, long *diff2)
  200. {
  201.   iface *cur;
  202.   long _total[5];
  203.  
  204.   bzero (_total, sizeof (long) * 5);
  205.   for (cur = top; cur != NULL; cur = cur->next)
  206.     {
  207.       cur->update (cur);
  208.       if (cur == src)
  209.     {
  210.       diff2[0] = cur->rawrcvcnt - total2[0];
  211.       diff2[1] = cur->rcverrcnt - total2[1];
  212.       diff2[2] = cur->rawsndcnt - total2[2];
  213.       diff2[3] = cur->snderrcnt - total2[3];
  214.       diff2[4] = cur->collcnt - total2[4];
  215.       total2[0] = cur->rawrcvcnt;
  216.       total2[1] = cur->rcverrcnt;
  217.       total2[2] = cur->rawsndcnt;
  218.       total2[3] = cur->snderrcnt;
  219.       total2[4] = cur->collcnt;
  220.     }
  221.       _total[0] += cur->rawrcvcnt;
  222.       _total[1] += cur->rcverrcnt;
  223.       _total[2] += cur->rawsndcnt;
  224.       _total[3] += cur->snderrcnt;
  225.       _total[4] += cur->collcnt;
  226.     }
  227.   diff[0] = _total[0] - total[0];
  228.   diff[1] = _total[1] - total[1];
  229.   diff[2] = _total[2] - total[2];
  230.   diff[3] = _total[3] - total[3];
  231.   diff[4] = _total[4] - total[4];
  232.   total[0] = _total[0];
  233.   total[1] = _total[1];
  234.   total[2] = _total[2];
  235.   total[3] = _total[3];
  236.   total[4] = _total[4];
  237.   return;
  238. }
  239.  
  240. /************************************************
  241.  *                        *
  242.  ************************************************/
  243. static void
  244. sigint_handler (int dummy)
  245. {
  246.   return;
  247. }
  248.  
  249. /************************************************
  250.  *                        *
  251.  ************************************************/
  252. static void
  253. display_interface_list_c (char *i_name)
  254. {
  255.   iface *top, *cur;
  256.   long total[5], diff[5], Itotal[5], Idiff[5];
  257.  
  258.   top = get_iface_list ();
  259.   if (top)
  260.     {
  261.       for (cur = top; cur != NULL; cur = cur->next)
  262.     {
  263.       if (!i_name)
  264.         break;
  265.       if (!strcmp (cur->name, i_name))
  266.         break;
  267.     }
  268.       if (cur)
  269.     {
  270.       signal (SIGINT, sigint_handler);
  271.  
  272.       for (;;)
  273.         {
  274.           int ii;
  275.  
  276.           bzero (total, sizeof (long) * 5); bzero (diff, sizeof (long) * 5);
  277.           bzero (Itotal, sizeof (long) * 5); bzero (Idiff, sizeof (long) * 5);
  278.           printf ("   input    (%3s)     output            input   (Total)    output\n",
  279.               cur->name);
  280.           printf (" packets  errs  packets  errs colls   packets  errs  packets  errs colls\n");
  281.  
  282.           for (ii = 0; ii < 21; ii++)
  283.         {
  284.           /* make total */
  285.           calc_iface_stat (top, cur, total, diff, Itotal, Idiff);
  286.           /* display diff */
  287.           printf ("%8d  %4d %8d  %4d  %4d  %8d  %4d %8d  %4d  %4d\n",
  288.               Idiff[0], Idiff[1], Idiff[2], Idiff[3], Idiff[4],
  289.               diff[0], diff[1], diff[2], diff[3], diff[4]);
  290.           fflush (stdout);
  291. #ifdef __human68k__
  292.           while (_dos_keysns ())
  293.             _dos_getchar ();
  294. #endif
  295.           sleep (sleep_time);
  296.         }
  297.         }
  298.     }
  299.     }
  300.   return;
  301. }
  302.  
  303. /************************************************
  304.  *                        *
  305.  ************************************************/
  306. static void
  307. display_unix_socket (void)
  308. {
  309.   printf ("Sorry, not supported.\n");
  310. }
  311.  
  312. /************************************************
  313.  *                        *
  314.  ************************************************/
  315. static void
  316. display_inet_socket (void)
  317. {
  318.   int i, exist;
  319.  
  320.   exist = 0;
  321.   for (i = 0; i < num_of_socket; i++)
  322.     {
  323.       char buff[256];
  324.  
  325.       if (ntoa_sock (sockets[i], AF_INET, buff, no_convert_p))
  326.     {
  327.       if (!exist)
  328.         {
  329.           printf ("Active Internet Connections\n");
  330.           printf ("Proto Recv-Q Send-Q  Local Address          Foreign Address       (state)\n");
  331.         }
  332.       exist = 1;
  333.       printf ("%s\n", buff);
  334.     }
  335.     }
  336. }
  337.  
  338. /************************************************
  339.  *                        *
  340.  ************************************************/
  341. static char *
  342. itoa_rflag (route *cur)
  343. {
  344.   static char buff[8];
  345.   char *p;
  346.   iface *ifp;
  347.  
  348.   buff[0] = 'U';
  349.   p = &buff[1];
  350.  
  351.   ifp = cur->iface;
  352.   if (cur->target && (cur->target & ~(ifp->net_mask)))
  353.     *p++ = 'H';
  354.  
  355.   if (cur->gateway)
  356.     *p++ = 'G';
  357.  
  358.   *p++ = '\0';
  359.   return buff;
  360. }
  361.  
  362.  
  363. /************************************************
  364.  *                        *
  365.  ************************************************/
  366. static void
  367. display_route_table (void)
  368. {
  369.   route *cur;
  370.   route *def;
  371.   rtable *Routes;
  372.   int x, y;
  373.  
  374.   Routes = (rtable *)rt_top (&def);
  375.   if (!Routes)
  376.     return;
  377.  
  378.   printf ("Routing tables\n");
  379.   printf ("Destination      Gateway            Flags     Use  Interface\n");
  380.   if (def && def->iface)
  381.     display_a_route (def);
  382.  
  383.   for (x = 0; x < 32; x++)
  384.     {
  385.       for (y = 0; y < NROUTE; y++)
  386.     {
  387.       for (cur = (*Routes)[x][y]; cur != NULL; cur = cur->next)
  388.         display_a_route (cur);
  389.     }
  390.     }
  391.  
  392.   fflush (stdout);
  393.   return;
  394. }
  395.  
  396. /************************************************
  397.  *                        *
  398.  ************************************************/
  399. static void
  400. display_a_route (route *cur)
  401. {
  402.   char target[32], gateway[32], gateway1[32];
  403.   char *net, *gateway2;
  404.  
  405.   if (no_convert_p)
  406.     {
  407.       net = NULL;
  408.       if (cur->gateway)
  409.     gateway2 = gateway;
  410.       else
  411.     {
  412.       n2a_ipaddr (cur->iface->my_ip_addr, gateway1);
  413.       gateway2 = gateway1;
  414.     }
  415.     }
  416.   else
  417.     {
  418.       net = ipaddr2net (cur->target);
  419.       if (!net)
  420.     net = ipaddr2host (cur->target);
  421.       if (cur->gateway)
  422.     gateway2 = ipaddr2host (cur->gateway);
  423.       else
  424.     gateway2 = ipaddr2host (cur->iface->my_ip_addr);
  425.     }
  426.   if (cur->target)
  427.     n2a_ipaddr (cur->target, target);
  428.   else
  429.     strcpy (target, "default");
  430.   n2a_ipaddr (cur->gateway, gateway);
  431.  
  432.   printf ("%-16s %-16s   %-5s   %5d  %9s\n",
  433.       net ? : target, gateway2 ? : gateway,
  434.       itoa_rflag (cur),
  435.       cur->uses, cur->iface->name);
  436. }
  437.  
  438. /************************************************
  439.  *                        *
  440.  ************************************************/
  441. static char *
  442. ipaddr2host (long ipaddr)
  443. {
  444.   struct hostent *h;
  445.  
  446.   h = gethostbyaddr ((char *)&ipaddr, sizeof (long), AF_INET);
  447.   if (h)
  448.     {
  449.       char *p, *q;
  450.  
  451.       p = malloc (strlen (h->h_name) + 1);
  452.       if (!p)
  453.     return NULL;
  454.       strcpy (p, h->h_name);
  455.       q = strchr (p, '.');
  456.       if (q)
  457.     {
  458.       if (!strcmp (q + 1, get_domain_name ()))
  459.         *q = 0;
  460.     }
  461.       return p;
  462.     }
  463.   return NULL;
  464. }
  465.  
  466. /************************************************
  467.  *                        *
  468.  ************************************************/
  469. static char *
  470. ipaddr2net (long ipaddr)
  471. {
  472.   struct netent *h;
  473.  
  474.   h = getnetbyaddr (ipaddr, AF_INET);
  475.   if (h)
  476.     return h->n_name;
  477.   return NULL;
  478. }
  479.  
  480.